home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / misc / emu / arosdev.lha / AROS / rom / exec / attemptsemaphore.c < prev    next >
C/C++ Source or Header  |  1997-01-09  |  2KB  |  98 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: attemptsemaphore.c,v 1.7 1997/01/01 03:46:06 ldp Exp $
  4.     $Log: attemptsemaphore.c,v $
  5.     Revision 1.7  1997/01/01 03:46:06  ldp
  6.     Committed Amiga native (support) code
  7.  
  8.     Changed clib to proto
  9.  
  10.     Revision 1.6  1996/12/10 13:51:38  aros
  11.     Moved all #include's in the first column so makedepend can see it.
  12.  
  13.     Revision 1.5  1996/10/24 15:50:45  aros
  14.     Use the official AROS macros over the __AROS versions.
  15.  
  16.     Revision 1.4  1996/08/13 13:55:58  digulla
  17.     Replaced AROS_LA by AROS_LHA
  18.     Replaced some AROS_LH*I by AROS_LH*
  19.     Sorted and added includes
  20.  
  21.     Revision 1.3  1996/08/01 17:41:05  digulla
  22.     Added standard header for all files
  23.  
  24.     Desc:
  25.     Lang: english
  26. */
  27. #include "exec_intern.h"
  28. #include <exec/semaphores.h>
  29. #include <proto/exec.h>
  30.  
  31. /*****************************************************************************
  32.  
  33.     NAME */
  34.  
  35.     AROS_LH1(ULONG, AttemptSemaphore,
  36.  
  37. /*  SYNOPSIS */
  38.     AROS_LHA(struct SignalSemaphore *, sigSem, A0),
  39.  
  40. /*  LOCATION */
  41.     struct ExecBase *, SysBase, 96, Exec)
  42.  
  43. /*  FUNCTION
  44.     Tries to get an exclusive lock on a signal semaphore. If the semaphore
  45.     is already in use by another task this function does not wait but
  46.     return false instead.
  47.  
  48.     INPUTS
  49.     sigSem - Pointer so semaphore structure.
  50.  
  51.     RESULT
  52.     TRUE if the semaphore could be obtained, FALSE otherwise.
  53.  
  54.     NOTES
  55.     The lock must be freed with ReleaseSemaphore().
  56.  
  57.     EXAMPLE
  58.  
  59.     BUGS
  60.  
  61.     SEE ALSO
  62.     ReleaseSemaphore()
  63.  
  64.     INTERNALS
  65.  
  66.     HISTORY
  67.     29-10-95    digulla automatically created from
  68.                 exec_lib.fd and clib/exec_protos.h
  69.     21-01-96    fleischer implementation
  70.  
  71. *****************************************************************************/
  72. {
  73.     AROS_LIBFUNC_INIT
  74.     AROS_LIBBASE_EXT_DECL(struct ExecBase *,SysBase)
  75.  
  76.     LONG ret=0;
  77.  
  78.     /* Arbitrate for semaphore nesting count and owner fields */
  79.     Forbid();
  80.  
  81.     /* If the semaphore is free or the user is the current task */
  82.     if(!sigSem->ss_NestCount||sigSem->ss_Owner==SysBase->ThisTask)
  83.     {
  84.     /* Get an exclusive lock on it */
  85.     ObtainSemaphore(sigSem);
  86.  
  87.     /* And return true */
  88.     ret=1;
  89.     }
  90.  
  91.     /* All done */
  92.     Permit();
  93.     return ret;
  94.  
  95.     AROS_LIBFUNC_EXIT
  96. } /* AttemptSemaphore */
  97.  
  98.